const app = getApp()
const api = require('../../utils/api')

Page({
  /**
   * 页面的初始数据
   * userClassifications: 用户分类状态对象
   * isDataChanged: 数据是否已修改
   * diseaseOptions: 疾病选项
   * populationOptions: 人群分类选项
   * tipContents: 提示信息内容
   * userTypes: 用户类型列表
   * managementOptions: 管理选项列表
   * selectedUserType: 选中的用户类型
   * selectedOptions: 选中的管理选项
   * showModal: 是否显示类型详情弹窗
   * currentTypeDetail: 当前显示的用户类型详情
   * isEditing: 是否处于编辑模式
   * originalData: 保存原始数据，用于取消时恢复
   */
  data: {
    // 用户分类状态
    userClassifications: {
      hasDiabetes: false,      // 是否有糖尿病
      hasHypertension: false,  // 是否有高血压
      isPregnant: false,       // 是否怀孕
      isElderly: false,        // 是否老年人
      isHighRisk: false        // 是否高风险人群
    },
    // 数据是否已修改
    isDataChanged: false,
    // 疾病选项
    diseaseOptions: [
      { id: 'hasDiabetes', name: '糖尿病', value: false, desc: '我有糖尿病或糖尿病前期' },
      { id: 'hasHypertension', name: '高血压', value: false, desc: '我有高血压' }
    ],
    // 人群分类选项
    populationOptions: [
      { id: 'isPregnant', name: '孕期', value: false, desc: '我目前怀孕或计划怀孕' },
      { id: 'isElderly', name: '老年', value: false, desc: '我是65岁以上老年人' },
      { id: 'isHighRisk', name: '高风险', value: false, desc: '我有家族病史或其他高风险因素' }
    ],
    // 提示信息内容
    tipContents: {
      hasDiabetes: '如果您有糖尿病或糖尿病前期，系统将为您提供针对性的血糖管理建议，包括用药提醒、血糖监测计划等。',
      hasHypertension: '如果您有高血压，系统将增加血压监测频率建议，提供饮食和运动指导，以帮助您有效控制血压。',
      isPregnant: '如果您处于孕期或计划怀孕，系统将调整健康建议，避免不适合孕期的用药和运动方案，提供孕期健康管理指导。',
      isElderly: '如果您是65岁以上老年人，系统将提供适合老年人的健康建议，包括简化操作、适合老年人的运动和饮食计划。',
      isHighRisk: '如果您有家族病史或其他高风险因素，系统将提供针对性的预防建议，增加检测频率，帮助您及早发现健康风险。'
    },
    // 当前显示的提示信息ID
    currentTipId: '',
    // 是否显示提示弹窗
    showTipModal: false,
    userTypes: [
      {
        id: 1,
        name: '新确诊患者',
        description: '近期被确诊为糖尿病，需要基础指导',
        fullDescription: '适合近期被确诊为糖尿病，对疾病认知和管理经验较少的用户。系统将提供更多基础知识和入门级指导，帮助您建立正确的疾病管理意识和习惯。'
      },
      {
        id: 2,
        name: '长期患者',
        description: '长期患有糖尿病，需要稳定控制',
        fullDescription: '适合已确诊糖尿病一年以上，有一定疾病管理经验的用户。系统将提供稳定期的血糖控制方案，以及各种并发症的预防措施，帮助您维持稳定的健康状态。'
      },
      {
        id: 3,
        name: '高危人群',
        description: '未患糖尿病，但存在高风险因素',
        fullDescription: '适合未被确诊为糖尿病，但存在多种高风险因素（如肥胖、家族史、妊娠期等）的用户。系统将提供预防指导和风险监测建议，帮助您降低发病风险。'
      },
      {
        id: 4,
        name: '并发症患者',
        description: '已出现糖尿病并发症状，需特殊关注',
        fullDescription: '适合已出现糖尿病相关并发症（如视网膜病变、肾病、心血管问题等）的患者。系统将提供针对性的并发症管理方案和监测建议，并强调与医生的紧密配合。'
      }
    ],
    managementOptions: [
      {
        id: 1,
        name: '血糖监测',
        description: '定期监测和记录血糖数据'
      },
      {
        id: 2,
        name: '饮食管理',
        description: '个性化饮食建议和营养分析'
      },
      {
        id: 3,
        name: '运动管理',
        description: '适合糖尿病患者的运动建议'
      },
      {
        id: 4,
        name: '用药提醒',
        description: '药物服用时间和剂量提醒'
      },
      {
        id: 5,
        name: '并发症监测',
        description: '定期监测并发症风险和症状'
      }
    ],
    selectedUserType: null,
    selectedOptions: [],
    showModal: false,
    currentTypeDetail: {},
    isEditing: false,  // 是否处于编辑模式
    originalData: {}   // 保存原始数据，用于取消时恢复
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 如果是从编辑入口进入，直接进入编辑模式
    this.setData({
      isEditing: options.edit === 'true'
    })
    
    // 获取用户已保存的分类信息
    this.fetchUserCategory()
  },

  /**
   * 获取用户分类信息
   * 从API获取最新的用户分类信息
   */
  async getUserClassifications() {
    try {
      // 显示加载提示
      wx.showLoading({
        title: '加载中...'
      })
      
      // 获取用户分类信息
      const userClassifications = await api.user.getUserClassifications()
      
      // 更新页面数据
      this.setData({ 
        userClassifications,
        // 更新疾病选项的值
        diseaseOptions: this.data.diseaseOptions.map(option => ({
          ...option,
          value: userClassifications[option.id] || false
        })),
        // 更新人群分类选项的值
        populationOptions: this.data.populationOptions.map(option => ({
          ...option,
          value: userClassifications[option.id] || false
        }))
      })
      
      // 隐藏加载提示
      wx.hideLoading()
    } catch (err) {
      // 隐藏加载提示
      wx.hideLoading()
      
      console.error('获取用户分类信息失败:', err)
      wx.showToast({
        title: '获取用户分类信息失败',
        icon: 'none'
      })
    }
  },

  /**
   * 切换分类选项状态
   * @param {Object} e - 事件对象
   */
  toggleOption(e) {
    const { type, index } = e.currentTarget.dataset
    const key = type === 'disease' ? 'diseaseOptions' : 'populationOptions'
    const option = this.data[key][index]
    
    // 更新选项状态
    this.setData({
      [`${key}[${index}].value`]: !option.value,
      isDataChanged: true
    })
  },

  /**
   * 显示提示信息
   * @param {Object} e - 事件对象
   */
  showTip(e) {
    const { id } = e.currentTarget.dataset
    
    this.setData({
      currentTipId: id,
      showTipModal: true
    })
  },

  /**
   * 隐藏提示信息
   */
  hideTip() {
    this.setData({
      showTipModal: false
    })
  },

  /**
   * 保存用户分类
   * 将更新后的用户分类信息保存到系统
   */
  async saveClassifications() {
    // 如果数据未修改，直接返回
    if (!this.data.isDataChanged) {
      wx.navigateBack()
      return
    }
    
    try {
      // 显示加载提示
      wx.showLoading({
        title: '保存中...'
      })
      
      // 构建更新的分类数据
      const classifications = {}
      
      // 合并疾病选项
      this.data.diseaseOptions.forEach(option => {
        classifications[option.id] = option.value
      })
      
      // 合并人群分类选项
      this.data.populationOptions.forEach(option => {
        classifications[option.id] = option.value
      })
      
      // 更新用户分类信息
      await api.user.updateUserClassifications(classifications)
      
      // 隐藏加载提示
      wx.hideLoading()
      
      // 提示保存成功
      wx.showToast({
        title: '保存成功',
        icon: 'success'
      })
      
      // 发送数据更新事件
      const pages = getCurrentPages()
      const prevPage = pages[pages.length - 2] // 获取上一个页面
      if (prevPage) {
        // 触发上一个页面的自定义事件
        prevPage.updateUserInfo()
      }
      
      // 延迟返回上一页
      setTimeout(() => {
        wx.navigateBack()
      }, 1500)
    } catch (err) {
      // 隐藏加载提示
      wx.hideLoading()
      
      console.error('保存用户分类信息失败:', err)
      wx.showToast({
        title: '保存失败，请稍后再试',
        icon: 'none'
      })
    }
  },

  /**
   * 取消修改
   * 如果数据已修改，显示确认提示；否则直接返回
   */
  cancelEdit() {
    if (this.data.isDataChanged) {
      wx.showModal({
        title: '提示',
        content: '您的修改尚未保存，确定要离开吗？',
        success: (res) => {
          if (res.confirm) {
            wx.navigateBack()
          }
        }
      })
    } else {
      wx.navigateBack()
    }
  },

  /**
   * 获取用户分类信息
   */
  async fetchUserCategory() {
    try {
      wx.showLoading({
        title: '加载中...',
        mask: true
      })
      
      const categoryData = await api.userCategory.getUserCategory()
      
      if (categoryData) {
        this.setData({
          selectedUserType: categoryData.userTypeId,
          selectedOptions: categoryData.managementOptions || []
        })
      }
      
      wx.hideLoading()
    } catch (err) {
      wx.hideLoading()
      console.error('获取用户分类失败:', err)
      
      wx.showToast({
        title: '获取分类信息失败',
        icon: 'none'
      })
    }
  },
  
  /**
   * 开始编辑模式
   */
  startEditing() {
    // 保存原始数据，以便取消时恢复
    this.setData({
      originalData: {
        selectedUserType: this.data.selectedUserType,
        selectedOptions: [...this.data.selectedOptions]
      },
      isEditing: true
    })
  },
  
  /**
   * 选择用户类型
   */
  selectUserType(e) {
    const typeId = e.currentTarget.dataset.id
    this.setData({
      selectedUserType: typeId
    })
  },
  
  /**
   * 切换管理内容选项
   */
  toggleManagementOption(e) {
    const optionId = e.currentTarget.dataset.id
    const selectedOptions = [...this.data.selectedOptions]
    
    const index = selectedOptions.indexOf(optionId)
    if (index === -1) {
      // 如果不存在则添加
      selectedOptions.push(optionId)
    } else {
      // 如果已存在则移除
      selectedOptions.splice(index, 1)
    }
    
    this.setData({
      selectedOptions
    })
  },
  
  /**
   * 显示类型详情
   */
  showTypeDetail(e) {
    const typeId = e.currentTarget.dataset.id
    const currentType = this.data.userTypes.find(item => item.id === typeId)
    
    if (currentType) {
      this.setData({
        showModal: true,
        currentTypeDetail: currentType
      })
    }
  },
  
  /**
   * 隐藏弹窗
   */
  hideModal() {
    this.setData({
      showModal: false
    })
  },
  
  /**
   * 取消编辑
   */
  cancelEdit() {
    // 恢复原始数据并退出编辑模式
    if (this.data.originalData.selectedUserType !== undefined) {
      this.setData({
        selectedUserType: this.data.originalData.selectedUserType,
        selectedOptions: this.data.originalData.selectedOptions,
        isEditing: false
      })
    } else {
      this.setData({
        isEditing: false
      })
    }
  },
  
  /**
   * 保存用户分类
   */
  async saveCategory() {
    if (!this.data.selectedUserType) {
      wx.showToast({
        title: '请选择用户类型',
        icon: 'none'
      })
      return
    }
    
    try {
      wx.showLoading({
        title: '保存中...',
        mask: true
      })
      
      const categoryData = {
        userTypeId: this.data.selectedUserType,
        managementOptions: this.data.selectedOptions
      }
      
      await api.userCategory.updateUserCategory(categoryData)
      
      wx.hideLoading()
      
      // 退出编辑模式
      this.setData({
        isEditing: false
      })
      
      wx.showToast({
        title: '保存成功',
        icon: 'success'
      })
    } catch (err) {
      wx.hideLoading()
      console.error('保存用户分类失败:', err)
      
      wx.showToast({
        title: '保存失败，请重试',
        icon: 'none'
      })
    }
  }
}) 